# LeetCode 102、二叉树的层序遍历

# 一、题目描述

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

# 二、题目解析

# 三、参考代码

# 1、Java 代码

// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 二叉树的层序遍历( LeetCode 102 ):https://leetcode-cn.com/problems/binary-tree-level-order-traversal
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        // 设置 res 用来保存输出结果
        List<List<Integer>> res = new LinkedList<>();
        // 边界情况处理
        if(root == null) return res;
        
        // 设置一个队列,用来存储二叉树中的元素
        Queue<TreeNode> queue = new LinkedList<>();
        // 队列添加二叉树的根节点
        queue.add(root);

        // 遍历队列,直到队列为空,说明访问了二叉树中所有的节点
        while(!queue.isEmpty()){  
            // 用来记录 queue 的长度,即每层节点的个数
            int size = queue.size();  

            // 用来保存每一层节点,保存成功后添加到 res 中
            List<Integer> temp =  new ArrayList<>(); 
  
            // 使用 for 循环,将 queue 中的元素添加的 temp 中
            for(int i = 0 ; i < size ;  i++ ){     
                // 从 queue 中取出一个节点         
                TreeNode node = queue.poll();  
                // 把节点存放到 list 中
                temp.add(node.val);  //将节点值加入list

                // 判断当前节点的左子节点是否有值,如果有,则添加到 queue 中
                if(node.left != null)
                    queue.add(node.left);

                // 判断当前节点的右子节点是否有值,如果有,则添加到 queue 中    
                if(node.right != null)
                    queue.add(node.right);
            }

            // 把存放了每一层元素的数组 temp 添加到 res 中
            res.add(temp);
        }

        // 返回 res
        return res; 
    }
}

# **2、**C++ 代码

// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 二叉树的层序遍历( LeetCode 102 ):https://leetcode-cn.com/problems/binary-tree-level-order-traversal
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        // 设置 res 用来保存输出结果    
        vector<vector<int>> res;
        // 边界情况处理
        if(root == NULL) return res;

        // 设置一个队列,用来存储二叉树中的元素
        queue<TreeNode*> myqueue;
        // 队列添加二叉树的根节点
        myqueue.push(root);

        // 遍历队列,直到队列为空,说明访问了二叉树中所有的节点
        while(!myqueue.empty()){  
            // 用来记录 myqueue 的长度,即每层节点的个数
            int size = myqueue.size();  

            // 用来保存每一层节点,保存成功后添加到 res 中
            vector<int> temp;

            // 使用 for 循环,将 myqueue 中的元素添加的 temp 中
            for(int i = 0 ; i < size ;  i++ ){     
                // 从 myqueue 中取出一个节点         
                TreeNode* node = myqueue.front();
    myqueue.pop();    
                // 把节点存放到 list 中
                temp.push_back(node->val);  //将节点值加入list

                // 判断当前节点的左子节点是否有值,如果有,则添加到 myqueue 中
                if(node->left != NULL)
                    myqueue.push(node->left);

                // 判断当前节点的右子节点是否有值,如果有,则添加到 myqueue 中    
                if(node->right != NULL)
                    myqueue.push(node->right);
            }

            // 把存放了每一层元素的数组 temp 添加到 res 中
            res.push_back(temp);
        }

        // 返回 res
        return res; 
    }
};

# 3、Python 代码

#登录 AlgoMooc 官网获取更多算法图解
# https://www.algomooc.com
# 作者:程序员吴师兄
# 代码有看不懂的地方一定要私聊咨询吴师兄呀
# 二叉树的层序遍历( LeetCode 102 ):https://leetcode-cn.com/problems/binary-tree-level-order-traversal
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:

        # 设置 res 用来保存输出结果
        res = []

        # 边界情况处理
        if not root :
           return res
        
        # 设置一个队列,用来存储二叉树中的元素
        queue = deque()
        
        # 队列添加二叉树的根节点
        queue.append(root)

        # 遍历队列,直到队列为空,说明访问了二叉树中所有的节点
        while queue :
            # 用来记录 queue 的长度,即每层节点的个数
            size = len(queue)

            # 用来保存每一层节点,保存成功后添加到 res 中
            temp = []
        
            # 使用 for 循环,将 queue 中的元素添加的 temp 中
            for _ in range(size) :
                # 从 queue 中取出一个节点         
                node =  queue.popleft()
                # 把节点存放到 list 中
                temp.append(node.val)

                # 判断当前节点的左子节点是否有值,如果有,则添加到 queue 中
                if node.left : queue.append(node.left)
                   

                # 判断当前节点的右子节点是否有值,如果有,则添加到 queue 中    
                if node.right : queue.append(node.right)
                    

            # 把存放了每一层元素的数组 temp 添加到 res 中
            res.append(temp)
        

        # 返回 res
        return res